package com.mpyy.handler.purchase;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.mpyy.pojo.ProductType;
import com.mpyy.pojo.ProductTypeTree;
import com.mpyy.service.purchase.SearchProTypeServiceInter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @version 1.0
 * @Descoription SearchProdutHandlerType
 * @Author CG
 * @date 2022-03-09
 */

@Controller
public class SearchProdutHandlerType {
    @Autowired
    @Qualifier(value = "searchProTypeServiceImpl")
    private SearchProTypeServiceInter searchProTypeServiceInter;

    @RequestMapping(value = {"/searchProdutType"})
    @ResponseBody
    public String searchProdutType(){
        //商品类别数据
       List<ProductType> productTypes = searchProTypeServiceInter.searchProdoutType();

       //新建一个集合用于将数据转化为符合tree的格式
       List<ProductTypeTree> trees = new ArrayList<>();

       //1.将数据转存至productTypeTree类型的List中（tree对于数据的键有一定要求）
       for (ProductType productType : productTypes) {

           ProductTypeTree productTypeTree = new ProductTypeTree(
                   productType.getProTypeId(),productType.getProTypeName(),
                   productType.getProLevelParId(),null
           );
           //将数据添加到集合中
           trees.add(productTypeTree);
       }

       //创建一个新集合用于保存处理过后的数据 并为其添加子节点数据
       List<ProductTypeTree> tree = new ArrayList<ProductTypeTree>();

       for (ProductTypeTree typeTree : trees) {
           //对象的上级编号为null(ProLevelParId()== null) 当前为父级
           if (typeTree.getProLevelParId()==null){
               //调用子节点方法并将数据追加至集合中
               tree.add(findChildren(typeTree,trees));
           }
       }
       //创建Map集合 将数据转换为JSON格式并将其传递给页面
       Map<Object,Object> map = new HashMap<>();
        map.put("data",tree);
       return JSON.toJSONString(map,SerializerFeature.DisableCircularReferenceDetect);
   }

    /**
     * 查找子节点的方法
     * @param treeNode
     * @param treeNodes
     * @return
     */
    public static ProductTypeTree findChildren(ProductTypeTree treeNode, List<ProductTypeTree> treeNodes){
        //1.遍历整个保存数据的集合
        for (ProductTypeTree tree : treeNodes){
            //1.1如果传递过来的父节点的id与某节点的父id相同，则表示它们存在父子关系
            if (treeNode.getId().equals(tree.getProLevelParId())) {
                //判断父节点的Children集合是否为空
                if(treeNode.getChildren()==null){
                    //如果为空 新建一个集合 new ArrayList<ProductTypeTree>()
                    treeNode.setChildren(new ArrayList<ProductTypeTree>());
                }
                //继续寻找当前子节点的下一级，寻找完毕后加入当前父节点
                treeNode.getChildren().add(findChildren(tree,treeNodes));
            }
        }
        return treeNode;
    }
}
